package com.dianzhang.disruptor;

import com.dianzhang.disruptor.tools.DisruptorFactory;
import com.dianzhang.disruptor.tools.DisruptorMessage;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 在Spring Boot应用中，如果启动类没有使用`@SpringBootApplication`注解，则会导致以下问题：
 * <p>
 * 1. **自动配置不生效**：`@SpringBootApplication` 中的 `@EnableAutoConfiguration` 注解是Spring Boot自动配置的核心。如果没有这个注解，Spring Boot将不会根据项目中的依赖关系自动配置Bean，如数据库连接、Web服务器（Tomcat、Jetty等）、模板引擎（Thymeleaf、FreeMarker）等，这会大大增加手动配置的工作量。
 * <p>
 * 2. **组件扫描受限**：`@SpringBootApplication` 继承了 `@ComponentScan` 注解，默认会扫描当前包及其子包下的所有 Spring 组件（包括@Service、@Repository、@Controller、@Component等）。如果没有这个注解，你需要显式地指定要扫描的包路径，否则相关组件可能无法被Spring容器管理。
 * <p>
 * 3. **整体功能缺失**：由于缺少了上述两个关键功能，Spring Boot应用可能无法正常启动或运行时出现各种错误，比如找不到Bean、服务不可用等。
 * <p>
 * 总之，对于一个标准的Spring Boot应用来说，启动类上使用`@SpringBootApplication`注解是非常关键的，它确保了整个应用能够利用Spring Boot带来的便捷性和自动化能力。如果你确实有特殊需求而不使用该注解，那么需要手动配置相关的ApplicationContext和Bean定义以替代自动化的部分。
 */
@SpringBootApplication
public class XDisruptorApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(XDisruptorApplication.class, args);

        DisruptorFactory bean = run.getBean(DisruptorFactory.class);

        DisruptorMessage disruptorMessage = new DisruptorMessage();
        disruptorMessage.setContent("hahaha");
        disruptorMessage.setType(2);

        ExecutorService executorService = Executors.newCachedThreadPool();

        for (int i = 0; i < 100; i++) {
            executorService.execute(() -> {
                bean.send(disruptorMessage);
            });
        }
        executorService.shutdown();
    }

}
